package server

import (
	"company_website/src/global"
	"company_website/src/model"
	"company_website/src/model/common"
	"company_website/src/model/request"
	"company_website/src/model/response"
	"company_website/src/utils"
	"encoding/json"
	"errors"
	"fmt"
	"gorm.io/gorm"
	"strconv"
	"time"
)

type commonApp struct {
}

// 返回页码
func (c *commonApp) GetPageRes(pageInfo common.PageReqInfo, db *gorm.DB) (common.PageResInfo, error) {
	pageRes := common.PageResInfo{}
	fmt.Println("repPageqinfo___", pageInfo)
	err := db.Count(&pageRes.SumData).Error
	if err != nil {
		return pageRes, err
	}
	pageRes.PageReqInfo = pageRes.PageReqInfo
	pageRes.SumPage = int(pageRes.SumData) / pageInfo.PageSize
	if int(pageRes.SumData)%pageInfo.PageSize != 0 {
		pageRes.SumPage++
	}
	return pageRes, nil
}

// 页码设置
func (c *commonApp) Paginate(pageInfo common.PageReqInfo, db *gorm.DB) *gorm.DB {
	var offset int = 0
	if pageInfo.CurrentPage != 0 {
		offset = (pageInfo.CurrentPage - 1) * pageInfo.PageSize
	}
	return db.Offset(offset).Limit(pageInfo.PageSize)
}

// 设置用户信息到redis
func (c *commonApp) SetUserToRedis(adminUser *model.AdminUser) (string, error) {
	// 生成唯一标识符
	uuid := utils.GetUuid(strconv.Itoa(adminUser.Id) + adminUser.AdminName)

	// 将用户信息转换为 JSON 格式
	userJSON, err := json.Marshal(adminUser)
	if err != nil {
		return "", err
	}

	// 设置键值对到 Redis
	r := global.GVL_REDIS
	// 检查 Redis 中是否存在该用户信息
	exists, err := r.Conn.Exists(r.Ctx, uuid).Result()
	if err != nil {
		return "", err
	}

	// 如果 Redis 中存在该用户信息，则更新
	if exists > 0 {
		err := r.Conn.Set(r.Ctx, uuid, string(userJSON), time.Duration(6)*time.Hour).Err()
		if err != nil {
			return "", err
		}
	} else {
		// 如果 Redis 中不存在该用户信息，则直接存入
		err := r.Conn.Set(r.Ctx, uuid, string(userJSON), time.Duration(6)*time.Hour).Err()
		if err != nil {
			return "", err
		}
	}
	return uuid, nil
}

func (c *commonApp) GetUnixTime() string {
	now := time.Now().UnixNano()
	currentTime := strconv.Itoa(int(now))
	return currentTime
}

// 从redis中读取管理员信息
func (c *commonApp) GetUserToRedis(token string) (*model.AdminUser, error) {
	userJSON, err := global.GVL_REDIS.Conn.Get(global.GVL_REDIS.Ctx, token).Result()
	if err != nil {
		return nil, err
	}
	// 解析用户信息 JSON
	user := &model.AdminUser{}
	if err := json.Unmarshal([]byte(userJSON), user); err != nil {
		// 如果解析出错，返回错误信息
		return nil, err
	}
	return user, nil
}

// 在数据库中验证管理员人logintoken
func (c *commonApp) VerifyLoginToken(LoginToken string) (*model.AdminUser, error) {
	resInfo := &model.AdminUser{}
	db := global.GVL_DB.Model(&model.AdminUser{})
	var count int64
	count = 0
	db.Where("login_token = ?", LoginToken).Count(&count).Find(&resInfo)
	if count == 1 {
		return resInfo, nil
	} else {
		return resInfo, errors.New("token not found")
	}
}

// 获取项目基础信息
func (c *commonApp) GetItemBasicInfoPage(adminName string) (*response.ItemBasic, error) {
	resInfo := &response.ItemBasic{}
	db := global.GVL_DB.Model(&model.Item{})
	adminName = "%" + adminName + "%"
	err := db.Where("people like ?", adminName).Limit(3).Find(&resInfo).Error
	if err != nil {
		fmt.Println("管理员基础信息查询失败", err)
		return nil, err
	}
	return resInfo, nil
}

// 获取项目详细信息
func (c *commonApp) GetAllItemInfoData(itemId int) (*model.Item, error) {
	resInfo := &model.Item{}
	db := global.GVL_DB.Model(&model.Item{})
	err := db.Where("id =  ?", itemId).Find(&resInfo).Error
	if err != nil {
		fmt.Println("管理员基础信息查询失败", err)
		return nil, err
	}
	return resInfo, nil
}

// 分页查找项目
func (c *commonApp) GetAllItem(ItemPage *request.ItemPage) (*response.ItemBasicPage, error) {
	resInfo := &response.ItemBasicPage{}
	var err error
	db := global.GVL_DB.Model(&model.Item{})
	ItemPage.AdminName = "%" + ItemPage.AdminName + "%"
	db.Where("people like ?", ItemPage.AdminName).Find(&resInfo)
	resInfo.PageInfo, err = ServerComment.GetPageRes(*ItemPage.Page, db)
	if err != nil {
		fmt.Println("getPageRes设置出错", err)
		return nil, err
	}
	resInfo.PageInfo.PageReqInfo = *ItemPage.Page
	db = ServerComment.Paginate(*ItemPage.Page, db)
	return resInfo, nil
}
